Mikä on nopein tapa muuntaa java.nio.ByteBuffer a (uudeksi luoduksi) CharBuffer b: ksi tai char [] b: ksi. Tekemällä tämän on tärkeää, että a [i] == b [i]. Tämä tarkoittaa, että ei [i] ja [i + 1] yhdessä muodosta arvoa b [j], mitä getChar (i) tekisi, mutta arvot tulisi "levittää". tavu a [] = {1,2,3, 125,126,127, -128, -127, -126} // kukin tavu (jotka on allekirjoitettu) char b [] = {1,2,3, 125,126,127, 128, 129, 130} // kukin char (jotka ovat allekirjoittamattomia) Huomaa, että tavulla: -128 on samat (alemmat 8) bittiä kuin char: 128: lla. Siksi oletan, että "paras" tulkinta olisi sellainen kuin totesin sen edellä, koska bitit ovat samat. Sen jälkeen tarvitsen myös päinvastoin: tehokkaimman tavan saada char [] tai java.nio.CharBuffer takaisin java.nio.ByteBufferiksi.
2021-01-06 08:18:58
Joten mitä haluat muuntaa käyttämällä koodausta ISO-8859-1. En väitä mitään tehokkuudesta, mutta ainakin se on melko lyhyt kirjoittaa: CharBuffer-tulos = Charset.forName ("ISO-8859-1"). Dekoodaa (byteBuffer); Toinen suunta olisi: ByteBuffer-tulos = Charset.forName ("ISO-8859-1"). Koodaa (charBuffer); Mittaa tätä muihin ratkaisuihin nähden. (Oikeudenmukaisuuden vuoksi Charset.forName-osaa ei pitäisi sisällyttää, ja se tulisi tehdä myös vain kerran, ei kullekin puskurille uudelleen.) Java 7: stä eteenpäin on myös StandardCharsets-luokka, jossa on ennakoituja Charset-esiintymiä, joten voit käyttää CharBuffer-tulos = StandardCharsets.ISO_8859_1.decode (byteBuffer); ja TavuBuffer-tulos = StandardCharsets.ISO_8859_1.encode (charBuffer); sen sijaan. (Nämä rivit tekevät samoin kuin aikaisemmat, vain haku on helpompaa, eikä nimien väärinkirjoitukseen ole vaaraa, eikä mahdottomia poikkeuksia tarvitse kiinni.) | Olisin samaa mieltä @ Ishtarin kanssa, ehdotan, että vältetään lainkaan muuntaminen uudeksi rakenteeksi ja muunnetaan vain tarpeen mukaan. Jos sinulla on kuitenkin kasa ByteBuffer, voit tehdä. TavuPuskuri bb = ... tavu [] taulukko = bb.haara (); char [] merkit = uusi char [bb.remaining ()]; for (int i = 0; i